package objetos;

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;

import fisica.ObjetoFisico;
import fisica.SimuladorFisico;

public class Caixa extends ObjetoFisico {
	
	public int evento, modoEvento;

	int bx, by;

	ObjetoFisico objetoCima = null;
	float oldX, oldY;

	
	float xDist = 0;
	long diftimeColicao;

	public double inicioX, inicioY;
	
	BufferedImage imagem;
	
	public Caixa(float x, float y,int evento, int modoEvento,String nome){
		this.X = x;
		this.Y = y;
		this.inicioX = x;
		this.inicioY = y;
		this.evento = evento;
		this.modoEvento = modoEvento;
		this.imagem = CanvasGame.instance.imagemBoxPush;
		this.raioDeColisao = 23;
		this.aceleracao = 1;
		this.massa = 80;
		this.velocidadeInicial = 0;
		this.evento = evento;
		this.modoEvento = modoEvento;
		this.nome = nome;
		this.altura = 40;
		this.largura = 40;

		SimuladorFisico.getSimulador().addObject(this);
	}
	
	


@Override
public boolean estaColidindoParede(long diftime) {
	int bx = (int) ((X + 16) / 16);
	int by = (int) ((Y + 28) / 16);
	
		if (CanvasGame.instance.mapaGenerico.mapa2[by-1][bx+1] > 0) {	
			//CanvasGame.instance.RIGHT = false;
			X-=10;
			Y--;
			return true;
		}

		if (CanvasGame.instance.mapaGenerico.mapa2[by-1][bx-1] > 0) {
			//CanvasGame.instance.LEFT = false;
			X+=10;
			Y--;
			return true;
		}
	
	return false;
}

@Override
public boolean estaColidindoChao(long diftime){
	int bx = (int) ((X + 16) / 16);
	int by = (int) ((Y + 28) / 16);

	if (CanvasGame.instance.mapaGenerico.mapa2[by-1][bx-2] > 0 || CanvasGame.instance.mapaGenerico.mapa2[by-1][bx+2] > 0) {
		if (CanvasGame.instance.mapaGenerico.mapa2[by+1][bx] > 0 ){
			this.estaColidindoChao = true;
			return true;
		}else{
			this.estaColidindoChao = false;
			return false;
		}
		
	}else{
		
		if (CanvasGame.instance.mapaGenerico.mapa2[by-1][bx] > 0) {
			if (CanvasGame.instance.mapaGenerico.mapa2[by][bx] > 0) {
			   Y--;
			   estaColidindoChao(diftime);
			}
		}else{
			if (CanvasGame.instance.mapaGenerico.mapa2[by][bx] > 0) {
				this.estaColidindoChao = true;
				return true;
			}else{
				this.estaColidindoChao = false;
				return false;
			}
		}
		
	}
	
	//this.tempoNoAr = 0;
	this.estaColidindoChao = false;
	return false;
}
	
	@Override
	public void SimulaSe(long diftime) {
		
			float oldX = this.X;
			float oldY = this.Y;
			
			if(this.estaColidindoChao()){
				this.X = oldX;
				this.Y = oldY;
			}
			
			//Y += velocidadeY*diftime/1000;          // NAO MUDAR DE LUGAR
			
			//COLICAO PLATAFORMAS ABAIXO
			for(int i=0;i< CanvasGame.instance.gerenciaPlataformaMovimentoVertical.listaPlataformaVertical.size();i++){
				if(CanvasGame.instance.gerenciaPlataformaMovimentoVertical.listaPlataformaVertical.get(i).modoEvento > 0){
					if(Y < CanvasGame.instance.gerenciaPlataformaMovimentoVertical.listaPlataformaVertical.get(i).Y){
						CanvasGame.instance.gerenciaPlataformaMovimentoVertical.listaPlataformaVertical.get(i).colisaoRetangular(this, diftime);
					}
				}
			}
			
			for(int i=0;i< CanvasGame.instance.gerenciaPlataformaMovimentoHorizontal.listaPlataformaHorizontal.size();i++){
				if(CanvasGame.instance.gerenciaPlataformaMovimentoHorizontal.listaPlataformaHorizontal.get(i).modoEvento > 0){
					CanvasGame.instance.gerenciaPlataformaMovimentoHorizontal.listaPlataformaHorizontal.get(i).colisaoRetangular(this, diftime);
				}
			}
			
			this.estaColidindoParede(diftime);
			this.estaColidindoChao(diftime);
		
	}
	@Override
	public void DesenhaSe(Graphics2D dbg, int mapx, int mapy) {
		dbg.drawImage(this.imagem, null , (int)(this.X- mapx),(int)(this.Y- mapy));

		if(CanvasGame.instance.tutorial){
			dbg.setColor(Color.RED);
			dbg.drawRect((int) (this.X - mapx), (int) (this.Y - mapy), (int) (altura),
					(int) (altura));
			dbg.drawOval((int)((this.X+this.largura/2)- mapx-this.raioDeColisao),(int)((this.Y+this.altura/2)- mapy-this.raioDeColisao), (int)this.raioDeColisao*2, (int)this.raioDeColisao*2);
		}
	}
	
	public Boolean colisaoRetangular(float x, float y) {
	
		if (this.X + largura > x && this.X < x+20){
			if(this.Y  <  y+20 && this.Y+ altura > y){
				return true;
			}
		}
		
		return false;
	}
	
	public boolean colisaoRetangular(ObjetoFisico objeto, float diffTime) {
		boolean colidiuCima = false;
		boolean colidiuLado = false;
		float oldX = this.X;
		
		if (this.X + largura > objeto.X && this.X < objeto.X + objeto.largura) {
		//	if(this.Y  < objeto.Y + objeto.altura && this.Y+this.altura > objeto.Y) {
			if(this.Y+20  < objeto.Y + objeto.altura && this.Y+this.altura-20 > objeto.Y) {
				colidiuLado = true;
			}
		}
		
		if (this.X + largura -10> objeto.X && this.X+10 < objeto.X + objeto.largura) {
			if(this.Y  < objeto.Y + objeto.altura && this.Y+this.altura-30 > objeto.Y) {
				colidiuCima = true;
			}
		}

		if(colidiuCima == true){
//			System.out.println("Caixa::colisaoRetangular"+this.nome+"  por  "+objeto.nome);
				
//			System.out.println(objeto.Y + " + "+objeto.altura );
			//if(objeto.Y + objeto.altura < this.Y+this.altura/2){
				objeto.Y = this.Y - objeto.altura+1;
				objeto.X += xDist;
//				System.out.println("FICAAAAAAAAAAAAAAAAAAAAAAAAAA");
//				System.out.println(objeto.nome);
				objeto.estaColidindoChao = true;
				objeto.tempoNoAr = 0;
				
		}else if(colidiuLado){
			///objeto.estaColidindoChao = false;
				if(objeto.X < this.X){
					this.X = objeto.X +objeto.largura;
				}else{
					this.X = objeto.X - this.largura;
				}
				xDist = this.X - oldX;
				//System.out.println("cDist : "+xDist);
		}else{
			xDist = 0;
		}
//		}
			//System.out.println("Caixa::colisaoRetangular eu "+this.nome+" estou colidindo com "+objeto.nome);
//			if(objeto.Y < this.Y-15){
//				if(Y <  this.Y){
//					objeto.Y = (float)(this.Y - 48);
//				}
//			}else{
//				System.out.println("Caixa::colisaoRetangular : heroi.X "+CanvasGame.instance.heroi.X);
//				System.out.println("Caixa::colisaoRetangular : objeto.X "+objeto.X);
//				System.out.println("Caixa::colisaoRetangular : caixa.X "+this.X);
//				if(objeto.X > this.X+this.largura/2){
//						//System.out.println("Caixa::colisaoRetangular : velocidade  "+objeto.velocidade);
//						///this.X -= CanvasGame.instance.heroi.velocidade* diffTime/1000.f;
//					this.X -= objeto.forcaEmpurro* diffTime/1000.f;
//					if(objeto.forcaEmpurro != 0){
//						this.forcaEmpurro = objeto.forcaEmpurro;
//					}
//				}else if(objeto.X < this.X){
////					//this.X += CanvasGame.instance.heroi.velocidade* diffTime/1000.f;
//					this.X += this.forcaEmpurro* diffTime/1000.f;
//					//System.out.println("Caixa::colisaoRetangular"+(this.empurrador == null?this.empurrador:this.empurrador.nome)+" forcaEmpurro"+objeto.forcaEmpurro+" empurrador "+this.nome);
//					if(objeto.forcaEmpurro > 0){
//						this.forcaEmpurro = objeto.forcaEmpurro;
//						//this.empurrador = objeto;
//					}
//				}
			
//			}
//		}else{
//			if(objeto.nome == "heroi"){
//				this.forcaEmpurro = 0;
//			}
//		}

		
		return colidiuCima||colidiuLado;
	}
}
